home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / snip1292.zip / RG_RAND.C < prev    next >
Text File  |  1992-12-26  |  987b  |  40 lines

  1. /*
  2. **  random.c -- "Minimal Standard" integer random number generator
  3. **
  4. **  based on "Random Number Generators: Good Ones Are Hard to Find",
  5. **  S.K. Park and K.W. Miller, Communications of the ACM 31:10 (Oct 1988).
  6. **
  7. **  linear congruential generator f(z) = 16807 z mod (2 ** 31 - 1)
  8. **
  9. **  uses L. Schrage's method to avoid overflow problems
  10. **
  11. **  adapted for C by R. Gardner, public domain
  12. */
  13.  
  14. static long int z = 1;
  15.  
  16. #define a 16807
  17. #define m 2147483647                                  /* 2 ** 31 - 1 */
  18. #define q (m / a)
  19. #define r (m % a)
  20.  
  21. long random (void)                  /* returns number in [1 .. 2147483646] */
  22. {
  23.       long int lo, hi, test;
  24.  
  25.       hi = z / q;
  26.       lo = z % q;
  27.       test = a * lo - r * hi;
  28.       if (test > 0)
  29.             z = test;
  30.       else  z = test + m;
  31.       return z;
  32. }
  33.  
  34. void srandom(unsigned int seed)                       /* set the seed */
  35. {
  36.       if (seed == 0)
  37.             seed = 1;
  38.       z = seed;
  39. }
  40.